home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programmer Power Tools
/
Programmer Power Tools.iso
/
bss
/
pup.arc
/
SET-PUP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1987-12-11
|
11KB
|
529 lines
#include <puppy.h>
#include <pupmem.h>
#include <ascii.h>
/*
This sets PUPPY.SYS and creates the message file.
(k) All rights reversed
*/
int sysfile; /* PUPPY.SYS global handle */
struct _pup pup; /* thing we build */
int events; /* events we find */
#define same(s1,s2) (strcmp(s1,s2)==0)
int _stack = 5000;
main(argc,argv)
int argc;
char **argv;
{
char *p,fn[SS],sw[SS];
int i;
FLAG quit,once,writeout;
printf("Pup configuration, version 1, 10 Dec 87\r\n");
printf("Tom Jennings, 164 Shipley\r\n");
printf("San Francisco CA 94107 USA\r\n");
printf("(k) all rights reversed\r\n");
sysfile= open("PUPPY.SYS",2); /* open it for read/write */
if (sysfile == -1) {
printf(" * File \"PUPPY.SYS\" doesn't exist, making a new one\r\n");
sysfile= creat("PUPPY.SYS",2); /* make a new one, */
if (sysfile == -1) {
printf(" * Can't create it!\r\n");
exit(1);
}
pup.top= 0; /* empty file */
pup.msgnbr= 1; /* first message number */
pup.quote_pos= 0L; /* not used yet */
pup.callers= 0L;
} else read(sysfile,&pup,sizeof(struct _pup)); /* read current settings, */
setdefaults(); /* fill in those blanks */
finit("PUP.SET");
lseek(sysfile,0L,0);
write(sysfile,&pup,sizeof(struct _pup));
close(sysfile);
setmsg(); /* create a message file */
exit(0);
}
/* Create an empty message file. */
setmsg() {
int f;
f= open("message.idx",0);
if (f != -1) {
close(f);
printf("A message base already exists\r\n");
return;
}
ffill("MESSAGE.IDX",sizeof(struct _msg),0);
ffill("MESSAGE.DAT",pup.msgsize,SUB);
}
/* Fill the specified file with junk. */
ffill(fname,n,c)
char *fname; /* filename */
int n; /* how many to write, */
char c; /* fill character */
{
char buff[1024];
int f,i;
long count;
for (i=0; i < sizeof(buff); i++) /* fill the buffer with nothings */
buff[i]= c;
printf("Creating message base file %s\r\n",fname);
f= creat(fname,1); /* create the file, */
if (f == -1) {
printf("Creation error!\r\n");
return;
}
for (count= (long) n * pup.messages; count > 0L; count -= n) {
n= (count < sizeof(buff)) ? count : sizeof(buff);
if (write(f,buff,n) != n) {
printf("Disk full!\r\n");
break;
}
}
close(f);
}
/* Set the defaults to put into PUPPY.SYS. */
setdefaults() {
char *p;
int i,i1,i2;
long l1,l2;
l1= pup.callers; /* preserve these */
l2= pup.quote_pos;
i1= pup.top;
i2= pup.msgnbr;
p= (char *) &pup; /* clear out the structure */
for (i= sizeof(struct _pup); i--;) *p++= NUL;
pup.top= i1;
pup.msgnbr= i2;
pup.callers= l1; /* restore */
pup.quote_pos= l2;
pup.messages= 50; /* size of message base */
pup.msgsize= 2048; /* msg size */
pup.nlimit= 60; /* default= 1 hr time limit, */
pup.klimit= 100; /* 100K download limit, */
pup.cd_bit= 0x80; /* CD bit on IBM Async Card CTS */
pup.maxbaud= 1200; /* 1200 baud max */
strcpy(pup.mdmstr,"ATX1E0V0M0S0=0"); /* default modem init */
pup.connect_tries= 1; /* 1 attempt with connect */
pup.dial_tries= 10; /* 20 attempts to dial */
}
/* Fido initializer */
#define KEYLEN 10
char keyword[][KEYLEN] = {
/* 0 */ "time-limi",
"k-limit",
/* 2 */ "max-baud",
"cd-bit",
"modem-str",
/* 5 */ "dial-trie",
"connect-t",
"io-port",
/* 8 */ "node",
"net",
"zone",
/* 11 */ "file-pref",
/* 12 */ "message-t",
"message-s",
/* 14 */ "event",
/* 15 */ "topic",
"" /* end of list */
};
finit(fn)
char *fn;
{
char *process();
int i,f;
char ln[256]; /* LONG raw input line */
char word[sizeof(ln)]; /* word we parse */
char arg[sizeof(ln)]; /* an arg for it */
int value; /* argument value */
int line; /* line in file */
FLAG err; /* error in file */
char *cp;
f= open(fn,0);
if (f == -1) {
printf(" * Can't find Startup File %s\r\n",fn);
return(0);
}
err= 0;
line= 0;
while (rline(f,ln,sizeof(ln))) {
++line;
clip_cmt(ln); /* strip off comments */
cp= skip_delim(ln); /* skip leading blanks, etc */
if (*cp == NUL) continue; /* ignore blank lines */
if (*cp == '*') { /* label line */
puts(ln); puts("\r\n");
continue;
}
cpyatm(word,cp); /* the key word, */
word[KEYLEN - 1]= NUL; /* truncate to match */
cp= next_arg(cp); /* ptr to rest of line */
cpyatm(arg,cp); /* its (default) arg */
if (! *arg) {
inierr(fn,line,ln,"Incomplete command");
err= 1;
continue;
}
stolower(word);
stolower(arg);
value= atoi(arg); /* atoi() it blindly */
if (same(arg,"on") || same(arg,"yes"))
value= 1; /* else 0 == off == no */
for (i= 0; *keyword[i]; ++i) { /* find the word, */
if (same(keyword[i],word)) { /* if a match, */
cp= process(i,arg,cp,value); /* do it, */
if (*cp) {
inierr(fn,line,ln,cp);
err= 1;
}
break;
}
}
if (! *keyword[i]) {
inierr(fn,line,ln,"Not a command");
err= 1;
}
}
close(f);
return(1);
}
/* Complain about this line. */
inierr(fn,lineno,ln,error)
char *fn;
int lineno;
char *ln,*error;
{
printf("%s in file %s at line %d\r\n",error,fn,lineno);
printf(" \"%s\"\r\n",ln);
}
/* Process the keyword. */
char *process(i,arg,cp,value)
int i; /* keyword table index */
char *arg; /* next word at cp, for convenience */
char *cp; /* ptr to line after keyword */
int value; /* atoi of arg for convenience */
{
char *rp;
char *build_sched();
rp= "";
switch (i) {
case 0: pup.nlimit= value; break;
case 1: pup.klimit= value; break;
case 2: pup.maxbaud= value; break;
case 3: pup.cd_bit= value; break;
case 4: stoupper(cp); strcpy(pup.mdmstr,cp); break;
case 5: pup.dial_tries= value; break;
case 6: pup.connect_tries= value; break;
case 7: pup.iodev= value; break;
case 8: pup.id.number= value; break;
case 9: pup.id.net= value; break;
case 10: pup.id.zone= atoi(arg); break;
case 11: strcpy(pup.filepref,arg); break;
case 12: pup.messages= value; break;
case 13: pup.msgsize= value; break;
case 14: if (events < SCHEDS) {
rp= build_sched(&pup.sched[events],cp);
if (! *rp) ++events;
} else rp= "Too many EVENTS";
break;
case 15: for (i= 0; i < 16; i++) {
if (! *pup.topic[i].name) {
arg[8]= NUL;
strcpy(pup.topic[i].name,arg);
cp= next_arg(cp);
cp[24]= NUL;
strcpy(pup.topic[i].desc,cp);
break;
}
}
if (i == 16) rp= "Too many TOPICs";
break;
}
return(rp);
}
/* Fill in the event structure. */
char *build_sched(a,cp)
struct _sched *a;
char *cp;
{
char buff[SS],c;
int n,h,m;
long l;
a-> hr= atoi(cp); /* get start time, */
if (a-> hr > 23) return("Hour must be 0 to 23");
while (isdigit(*cp)) ++cp; /* look for a colon */
if (*cp == ':') a-> min= atoi(++cp); /* get mins if so, */
else a-> min= 0;
if (a-> min > 59) return("Minute must be 0 to 59");
cp= next_arg(cp); /* get sched width */
a-> len= atoi(cp); /* or is it ERRORLEVEL */
cp= next_arg(cp); /* do tag */
a-> tag= toupper(*cp);
if ((a-> tag < 'A') || (a-> tag > 'X'))
return("Event types must be A - X");
cp= next_arg(cp); /* options */
stolower(cp); /* all lower case */
while (*cp) switch (*cp++) {
case 'o': a-> bits |= SCHED_OPTIONAL; break;
}
return("");
}
/* Strip comments from a line of text; truncate it at the semicolon, then work
backwards deleting delimiters. */
clip_cmt(cp)
char *cp;
{
char *sp;
sp= cp; /* remember where we started */
while (*cp) {
if (*cp == ';') { /* search for a semicolon */
*cp= NUL; /* kill it, */
while (delim(*--cp)) /* kill all delims */
*cp= NUL;
break;
}
++cp;
}
}
/* Read a line of text from the file, null terminate it. Function returns
zero if EOF. Deletes all CRs and Control-Zs from the stream. Lines are
terminated by LFs. */
rline(file,buf,len)
int file;
char *buf;
int len;
{
int i;
char notempty,c;
i= 0; notempty= 0;
--len; /* compensate for added NUL */
while (i < len) {
if (! read(file,&c,1)) break; /* stop if empty */
if (c == 0x1a) continue; /* totally ignore ^Z, */
notempty= 1; /* not empty */
if (c == '\r') continue; /* skip CR, */
if (c == '\r' + 128) continue; /* skip soft CR, */
if (c == '\n') break; /* stop if LF */
buf[i++]= c;
}
buf[i]= '\0';
return(notempty);
}
/* Return the number of args left in the string. */
num_args(s)
char *s;
{
int count;
count= 0;
s= skip_delim(s); /* skip leading blanks, */
while (*s) {
++count; /* count one, */
s= next_arg(s); /* find next, */
}
return(count);
}
/* Return a pointer to the next argument in the string. */
char *next_arg(s)
char *s;
{
while ((!delim(*s)) && *s) /* skip this one, */
++s; /* up to delim, */
s= skip_delim(s); /* then skip delims, */
return(s);
}
/* Skip over the leading delimiters in a string. */
char *skip_delim(s)
char *s;
{
while (delim(*s) && *s) {
++s;
}
return(s);
}
/* Copy the string to the destination array, stopping if we find one
of our delimiters. */
cpyatm(to,from)
char *to;
char *from;
{
while ( (!delim(*from)) && *from)
*to++= *from++;
*to= '\0';
}
/* Copy the string to the destination array, stopping if we find one
of our delimiters. */
cpyarg(to,from)
char *to;
char *from;
{
while (*from) {
if (delim(*from)) break;
*to++= *from++;
}
*to= '\0';
}
/* Return true if the character is a delimiter. */
delim(c)
char c;
{
switch (c) {
case ';': return(1);
case ' ': return(1);
case ',': return(1);
case TAB: return(1);
default: return(0);
}
}
/* Strip the pathname or disk specifier from a filename, return it in a
seperate array. We do this by initially copying the entire name in, then
searching for the colon or slash. Right after the last one we find,
stuff a null, removing the name part.
Also return a pointer to the name part in the input name. */
char *strip_path(out,in)
char *out;
char *in;
{
char *name;
char *endpath;
strcpy(out,in); /* duplicate, for working, */
name= in; /* point to name, */
endpath= out; /* and end of path part, */
while (*in) { /* look for slashes or colons, */
if (*in == ':') { /* if a colon, */
endpath= ++out; /* point to name, */
name= ++in;
} else if (*in == '/') {
endpath= ++out; /* move the pointer up, */
name= ++in;
} else {
++in;
++out;
}
}
*endpath= '\0'; /* delete the name part, */
return(name); /* return ptr to name part. */
}
/* Convert a string to lower case. */
stolower(s)
char *s;
{
while (*s) {
*s= tolower(*s);
++s;
}
}
/* Convert a string to upper case. */
stoupper(s)
char *s;
{
while (*s) {
*s= toupper(*s);
++s;
}
}
/* atoi() function missing from Lattice C. From Kernighan and Richie. */
atoi(s)
char *s;
{
int n;
n= 0;
while ((*s >= '0') && (*s <= '9')) {
n *= 10;
n += *s - '0';
++s;
}
return(n);
}